package cn.lj.base.service.impl;

import cn.lj.base.Exception.BusinessException;
import cn.lj.base.service.IVerifycodeService;
import cn.lj.base.util.Constant;
import cn.lj.base.util.StrUtils;
import cn.lj.user.domain.User;
import cn.lj.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;
@Service
public class VerifycodeServiceImpl implements IVerifycodeService {

    @Autowired
    private UserMapper userMapper;
    /*注入redis对象，同时标明注入的对象接口*/
    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;
    @Override
    public void smsCode(String phone,String type) {
        String code = null;
        Long timeMillis = null;
        /*获取type用于判断是注册还是绑定*/
        /*定义一个空字符串用来转变两者信息存入*/
        String  bussinessKey = "";
        if(type.equalsIgnoreCase("register")){
            /*如果前台传递的type是获取短信*/
            bussinessKey =Constant.REGISTER;
        }else {
            /*如果前台传递是绑定微信*/
            bussinessKey = Constant.BINDER;
        }
        //1.   验证手机号是否为空
        if(phone == null){
            throw new BusinessException("请输入正确的手机号码");
        }
         //2.   当手机号不为空时查询数据库看是否已经被注册
        User user = userMapper.findByPhone(phone);
        //3.    如果查询到的数据不为空，提示用户已经注册请登录
        if(user != null){
            throw new BusinessException("该用户已注册，请登录");
        }
        /*获取redis的信息：*/
        Object codeTemp = redisTemplate.opsForValue().get(Constant.REGISTER + ":" + phone);
        /*存放的信息格式：验证码：时间戳=》5554:98465dads*/
        //当缓存中有验证码，判断是否过期
        //4.    如果不为空，则表示是新用户注册，查询redis中缓存中的验证码是否过期
        if(codeTemp != null){
            //对存放的信息进行分割
            String[] split = codeTemp.toString().split(":");
            /*split[0] = 验证码
            * split[1] = 时间戳
            * */
            //5.    如果没有过期，再次发送缓存中的验证码，同时重新设置缓存时间
            if(System.currentTimeMillis()-Long.valueOf(split[1])<3*60*1000){
                //验证码未过期，则再次发送的验证码不变，只是重新设置缓存时间
                code = split[0];
                //重新获取时间戳
                timeMillis = System.currentTimeMillis();
            }else {
            //6.    如果已经过期或者缓存中没有，则重新获取验证码发送给用户，同时设置缓存时间
                code = StrUtils.getRandomString(4);
                timeMillis = System.currentTimeMillis();
            }
        }else {//7.如果缓存中没有相关信息，新用户注册
            code = StrUtils.getRandomString(4);
            timeMillis = System.currentTimeMillis();
        }
        //8.    把信息存入缓存
        redisTemplate.opsForValue().set(bussinessKey+":"+phone,code+":"+timeMillis,3, TimeUnit.MINUTES);
        //9.    发送给用户
       // SmsUtil.sendSms("18223926394","尊敬的用户你的验证码为"+code+"请尽快填写，有效时间三分钟");
        System.out.println("你的"+type+"验证码为："+code);
    }
}
